/**
 * 模块操作
 */
const path = require("path")
const _ = require('lodash')
const {readFloors, 
    readModuleList, 
    saveModuleInfo,
    readConfigData,
    saveEditPropertyJson,
    saveConfigData,
    deleteModule} = require('../service/proxy')
const { writeFile} = require('../util/fileUtil')
// 楼层画布数据文件路径
const floorsFile = path.resolve(process.cwd(), "datas", "floors.json")

/**
 * 获得最大的模块id
 */
const getMaxModuleId = (list) => {
    let result = 100000
    if (list) {
        list.forEach((category) => {
            if (category.moduleList) {
                category.moduleList.forEach((module) => {
                    if (module.moduleId > result) {
                        result = module.moduleId
                    }
                })
            }
        })
    }
    return result
}

/**
 * 生成新的模块id
 * @param {*} list 
 * @returns 
 */
const getNextModuleId = (list) => {
    let nowMaxModuleId = getMaxModuleId(list);
    return ++nowMaxModuleId
}

// 左侧模块列表
const onModuleList = async (ctx) => {
    const list = readModuleList(ctx)
    ctx.send({ data: { code: 200, data: list } })
}

/**
 * 新建/保存模块
 * 入参：
 * {templateId, 整页模板id
 * moduleName, 模块名称-必传
 * description, 模块描述
 * moduleFlag, 模块标识，唯一 - 必传（英文数字）正式环境下此字段由后端创建
 * iconUrl,     模块封面
 * editPropertyJson, 模块配置界面描述文件
 * height, 模块兜底高度
 * onlyNewModuleId, 是否只需要新建模块id
 * midTemplateId, 中台模板id(新建时不传递)
 * moduleId,    模块id（新建时不传递）
 * configData, 模块配置数据
 * }
 * @param {*} ctx 
 * @return 返回当前模块数据
 */
const onSaveModule = async (ctx) => {
    const body = ctx.request.body
    const { templateId, moduleName, moduleFlag, onlyNewModuleId, description, iconUrl, editPropertyJson, height, moduleId, midTemplateId, configData } = body
    if (!moduleFlag) {
        ctx.send({ data: { code: 300, msg: '模块唯一标识不能为空' } })
        return
    }
    if (!moduleName) {
        ctx.send({ data: { code: 300, msg: '模块名称不能为空' } })
        return
    }
    let list = readModuleList()
    let moduleList = _.get(list, "[0].moduleList", [])
    if (!moduleId) {
        const module = moduleList.find((item) => {
            return item.moduleFlag == moduleFlag
        })
        // 新建模块
        if (module) {
            // 已经存在
            ctx.send({ data: { code: 300, msg: `${module.moduleFlag}【${module.moduleName}】模块已经存在，请重新输入模块信息` } })
            return
        }
        let desc = description || `${moduleName}模块描述`

        const newModuleId = getNextModuleId(list)
        if(onlyNewModuleId){
            let newModule = {
                "moduleId": newModuleId,
                "middleTemplateId": newModuleId,
                "moduleFlag": moduleFlag,
                "name": moduleName,
                "moduleName": moduleName,
            }
            ctx.send({ data: { code: 200, data: newModule } })
            return
        }
        let newModule = {
            "moduleId": newModuleId,
            "middleTemplateId": newModuleId,
            "moduleFlag": moduleFlag,
            "name": moduleName,
            "height": height,
            "moduleName": moduleName,
            "description": desc,
            "iconUrl": iconUrl || "//img12.360buyimg.com/uba/jfs/t1/29385/23/3944/875/5c2ddb84E85f45941/633c872c96ee3057.png",
            "previewUri": "//img13.360buyimg.com/imagetools/jfs/t1/125165/5/27761/18010/62593f92Eef8bc311/c397b2a2a10fd528.png"
        }
        saveModuleInfo(newModule)
        saveEditPropertyJson(moduleFlag, editPropertyJson || {})
        saveConfigData(moduleFlag, configData || {})
        ctx.send({ data: { code: 200, data: newModule } })
    }
    else {
        // 更新模块
        const index = moduleList.findIndex((item) => {
            return item.moduleId == moduleId
        })
        if (index == -1) {
            // 没有找到对应的模块信息
            ctx.send({ data: { code: 300, msg: `不存在moduleId为${moduleId}的模块` } })
            return
        }
        const module = moduleList[index]
        module.name = moduleName || module.name
        module.moduleName = moduleName || module.moduleName
        module.height = height || module.height
        module.description = description || module.description
        module.iconUrl = configData || module.iconUrl
        saveModuleInfo(module)
        saveEditPropertyJson(moduleFlag, editPropertyJson || module.editPropertyJson)
        const mconfigData = readConfigData(module.moduleFlag)
        saveConfigData(moduleFlag, configData || mconfigData)
        ctx.send({ data: { code: 200, data: module } })
    }
}

/**
 * 删除模块,删除模块时需要同时删除左侧模块数据和楼层实例数据
 * 入参：{
 * templateId, 整页模板id
 * moduleId, 模块id
 * }
 * @param {*} ctx 
 * @return 返回删除成功或者失败
 */
const onDeleteModule = async (ctx) => {
    const body = ctx.request.body
    const {templateId, moduleId} = body
    if(!moduleId){
        ctx.send({ data: { code: 300, msg: `入参moduleId不能为空` } })
        return
    }
    let list = readModuleList()
    let moduleList = _.get(list, "[0].moduleList", [])
    const module = moduleList.find((item) => {
        return item.moduleId == moduleId
    })
    if (!module) {
        // 没有找到对应的模块信息
        ctx.send({ data: { code: 300, msg: `不存在moduleId为${moduleId}的模块` } })
        return
    }
    
    // TODO:删除对应moduleId的楼层实例
    let floorChanged = false
    const floorContent = readFloors(floorsFile)
    for(let i = floorContent.floors.length-1; i>=0; i--){
        let floor = floorContent.floors[i]
        if(floor.moduleId == moduleId){
            floorChanged = true
            floorContent.floors.splice(i, 1)
            floorContent.containers.splice(i, 1)
        }
    }
    if(floorChanged){
        writeFile(floorsFile, JSON.stringify(floorContent, null, 4))
    }

    // 删除模块数据
    deleteModule(module.moduleFlag)

    ctx.send({ data: { code: 200, data: {success: true} } })
}


module.exports = {
    onModuleList,
    onSaveModule,
    onDeleteModule,
}